package com.catazzz.springbootstudy.service;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * @作者: Tao
 * @日期: 2025/1/2
 * @时间: 09:56
 * @描述: 定义事务服务接口，处理不同的事务传播行为和异常处理场景 <br><pre>
 */
public interface TransactionService {

    /**
     * 声明一个事务方法，使用嵌套事务传播行为
     * 当外部事务存在时，使用外部事务，否则创建新的事务
     * 此方法在出现异常时，事务将会回滚
     */
    @Transactional
    void transaction_nested_nested_externalException();

    /**
     * 声明一个事务方法，使用嵌套事务传播行为
     * 当外部事务存在时，使用外部事务，否则创建新的事务
     * 此方法在出现异常时，事务将会回滚
     */
    @Transactional
    void transaction_nested_nestedException();

    /**
     * 清理资源或状态的方法，不涉及事务处理
     */
    void clean();

    /**
     * 声明一个需要事务的方法，但此方法本身不启动事务
     * 如果外部没有事务，此方法将抛出异常
     */
    void noTransaction_required_required_externalException();

    /**
     * 声明一个需要事务的方法，但此方法本身不启动事务
     * 如果外部没有事务，此方法将抛出异常
     */
    void noTransaction_required_requiredException();

    /**
     * 声明一个事务方法，使用必须事务传播行为
     * 当外部事务存在时，使用外部事务，否则创建新的事务
     * 此方法在出现异常时，事务将会回滚
     */
    @Transactional
    void transaction_required_required_externalException();

    /**
     * 声明一个事务方法，使用必须事务传播行为
     * 当外部事务存在时，使用外部事务，否则创建新的事务
     * 此方法在出现异常时，事务将会回滚
     */
    @Transactional
    void transaction_required_requiredException();

    /**
     * 声明一个事务方法，使用必须事务传播行为，并尝试性地处理异常
     * 当外部事务存在时，使用外部事务，否则创建新的事务
     * 此方法试图处理异常，以决定事务是否回滚
     */
    @Transactional
    void transaction_required_requiredException_try();

    /**
     * 声明一个事务方法，使用必须新事务传播行为
     * 无论外部是否存在事务，都创建新的事务
     * 此方法在出现异常时，事务将会回滚
     */
    @Transactional
    void transaction_required_requiredNew_externalException();

    /**
     * 声明一个事务方法，使用必须新事务传播行为
     * 无论外部是否存在事务，都创建新的事务
     * 此方法在出现异常时，事务将会回滚
     */
    @Transactional
    void transaction_required_requiredNew_requiredNewException();

    /**
     * 声明一个事务方法，使用必须事务传播行为，并尝试性地处理异常
     * 当外部事务存在时，使用外部事务，否则创建新的事务
     * 此方法试图处理异常，以决定事务是否回滚
     */
    @Transactional(propagation = Propagation.REQUIRED)
    void transaction_required_requiredNewException_try();

    /**
     * 声明一个事务方法，使用嵌套事务传播行为，并尝试性地处理异常
     * 当外部事务存在时，使用外部事务，否则创建新的事务
     * 此方法试图处理异常，以决定事务是否回滚
     */
    @Transactional
    void transaction_nested_nestedException_try();
}

